package com.zmn.plat.services.interfaces.product.productgroup;

import com.zmn.common.dto.StatusDTO;
import com.zmn.plat.common.exception.PlatException;
import com.zmn.plat.model.entity.product.productgroup.ProductGroup;
import com.zmn.plat.model.entity.product.productgroup.ProductGroupQuery;
import com.zmn.plat.model.vo.product.productgroup.ProductGroupVO;

import java.util.List;

/**
 * 描述: 产品组基础接口类
 *
 * @author tanghongjun
 * @since 2020-08-19 11:18:36
 **/
public interface ProductGroupService {

    /**
     * 描述: 根据id查询数据
     *
     * @param groupId id
     * @return ProductGroup
     * @author tanghongjun
     * @since 2020-08-19 11:18:36
     **/
    ProductGroup findById(Integer groupId);

    /**
     * 描述: 获取最大的分组编码
     *
     * @return Integer
     * @author yangshuangping
     * @since 2021-8-6
     **/
    Integer findMaxGropCode();

    /**
     * 描述: 根据id查询数据
     *
     * @param groupIdList id集合
     * @return List<ProductGroup>
     * @author tanghongjun
     * @since 2020-08-19 11:18:36
     **/
    List<ProductGroup> listByIdList(List<Integer> groupIdList);

    /**
     * 描述:根据产品组名称集合和业务类型精准匹配产品组
     *
     * @param bizType  业务类型 必传
     * @param nameList 产品组名称集合 必传
     * @return List<ProductGroup>
     * @auther tanghongjun
     * @since 2020/9/30
     */
    List<ProductGroup> listByNameListAndBizType(Integer bizType, List<String> nameList) throws PlatException;

    /**
     * 描述:根据产品业务线id查询关联的分组id
     *
     * @param relateIds 业务线id 必传
     * @return List<Integer>
     * @auther tanbiao
     * @since 2020/10/27
     */
    List<Integer> listProductGroupIdByBusinessLine(List<Integer> relateIds);

    /**
     * 描述: 按条件查询数据 支持分页
     *
     * @param query 查询对象
     * @return List<ProductGroupVO>
     * @author tanghongjun
     * @since 2020-08-19 11:18:36
     **/
    List<ProductGroupVO> listPageByQuery(ProductGroupQuery query);

    /**
     * 描述: 按条件查询数据 不支持分页
     *
     * @param query 查询对象
     * @author tanghongjun
     * @since 2020-08-19 11:18:36
     **/
    List<ProductGroup> listByQuery(ProductGroupQuery query);

    /**
     * 状态查询树形关联关系数据,mcc权限分配树形结构专用
     *
     * @param status
     * @return List<ProductGroupVO>
     * @author tanbiao
     * @modifier
     * @since 2020/10/29 16:06
     */
    List<ProductGroupVO> listTreeByStatus(Integer status);

    /**
     * 描述: 根据查询条件统计满足条件的数据条数
     *
     * @param query 查询对象
     * @return: Integer
     * @auther: tanghongjun
     * @since: 2020-08-19 11:18:36
     */
    Integer countByQuery(ProductGroupQuery query);

    /**
     * 描述: 根据主键修改产品组的排序
     *
     * @param groupId         逐渐
     * @param sort            修改后的排序
     * @param mcStaffRealName 操作人
     * @return 执行结果码
     * @auther tanghongjun
     * @since 2020年8月21日16:47:00
     */
    void updateSortByKey(Integer groupId, Integer sort, String mcStaffRealName);

    /**
     * 描述: 根据id修改数据 id为必传
     *
     * @param productGroup 待修改数据
     * @return java.lang.Integer
     * @author tanghongjun
     * @since 2020-08-19 11:18:36
     **/
    Integer updateByKey(ProductGroup productGroup);

    /**
     * 描述: 修改产品组报销金额
     *
     * @param groupId
     * @param reimbursementAmount
     * @param mcStaffRealName
     * @return java.lang.Integer
     * @author jiafei
     * @since 2021/9/6 17:41
     */
    Integer updateReimbursementAmountByKey(Integer groupId, Integer reimbursementAmount, String mcStaffRealName);

    /**
     * 描述: 批量修改状态
     *
     * @param dto
     * @return 执行结果码
     * @auther tanghongjun
     * @since 2018/10/22 13:58
     */
    Integer updateStatusBatch(StatusDTO dto);

    /**
     * 描述: 新增数据
     *
     * @param productGroup 待新增数据
     * @return java.lang.Integer 主键key
     * @author tanghongjun
     * @since 2020-08-19 11:18:36
     **/
    Integer insert(ProductGroup productGroup);

    /**
     * 描述: 根据主键删除数据
     *
     * @param groupId
     * @return: 执行结果码
     * @auther: tanghongjun
     * @since: 2020-08-19 11:18:36
     */
    Integer deleteByKey(Integer groupId);

}
